
/*
openssl/md5.h：

[code]#define MD5_DIGEST_LENGTH 16

typedef struct MD5state_st
        {
        MD5_LONG A,B,C,D;
        MD5_LONG Nl,Nh;
        MD5_LONG data[MD5_LBLOCK];
        unsigned int num;
        } MD5_CTX;

int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);

需要用到的接口主要就是这些了。

struct MD5state_st是md5算法要用到的ctx结构
MD5_Init 是初始化ctx结构
MD5_Update 则是对输入参数data（其长度为len）进行md5计算。
MD5_Final是最后把结果输出至缓存md中。


struct MD5state_st是md5算法要用到的ctx结构
MD5_Init 是初始化ctx结构
MD5_Update 则是对输入参数data（其长度为len）进行md5计算。
MD5_Final是最后把结果输出至缓存md中。

OK，先写个程序试一盘：
[code]*/

#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>

int main(int argc, char **argv)
{
        MD5_CTX ctx;
        unsigned char *buf = "123456789abcdefgh/n";
        unsigned char md[MD5_DIGEST_LENGTH];
        int i;

        MD5_Init(&ctx);
        MD5_Update(&ctx, (void *)buf, strlen(buf));
        MD5_Final(md, &ctx);

        printf("%s md5: ", buf);
        for (i = 0; i < MD5_DIGEST_LENGTH; i++)
                printf("%02x", md[i]);
        printf("/n");
        return 0;
}

/*
[/code]

输出结果看看：
[code][root@Kendo develop]# ./md5test
123456789abcdefgh
md5: 6bd9796104fdb38fb400f4cb30778190[/code]

没有玩过这个，做了一个文件，将buf的内容放进去。调用openssl来看看：
[code][root@Kendo develop]# openssl md5 md5.conf
MD5(md5.conf)= 6bd9796104fdb38fb400f4cb30778190[/code]
结果一致，应该是正确地。
（Openssl API方便的资料感觉很少，一般偶都是摸着石头过河……）

用到这里了，想看看openssl的md5程序是如何实现的，至少它展示了如果对一个完整的文件进行md5校验，并且可以看看偶的API使用得对不对，进入源码目录，打开文件crypto/md5/md5.c：
[code]
*/


/*
#include <stdio.h>
#include <stdlib.h>
#include <openssl/md5.h>

#define BUFSIZE 1024 * 16

void do_fp(FILE *f);
void pt(unsigned char *md);
#if !defined(_OSD_POSIX) && !defined(__DJGPP__)
int read(int, void *, unsigned int);
#endif

int main(int argc, char **argv)
{
        int i, err = 0;
        FILE *IN;

        if (argc == 1)
        {
                do_fp(stdin);
        }
        else
        {
                for (i = 1; i < argc; i++)
                {
                        IN = fopen(argv[i], "r");
                        if (IN == NULL)
                        {
                                perror(argv[i]);
                                err++;
                                continue;
                        }
                        printf("MD5(%s)= ", argv[i]);
                        do_fp(IN);
                        fclose(IN);
                }
        }
        exit(err);
}

void do_fp(FILE *f)
{
        MD5_CTX c;
        unsigned char md[MD5_DIGEST_LENGTH];
        int fd;
        int i;
        static unsigned char buf[BUFSIZE];

        fd = fileno(f);
        MD5_Init(&c);
        for (;;)
        {
                i = read(fd, buf, BUFSIZE);
                if (i <= 0)
                        break;
                MD5_Update(&c, buf, (unsigned long)i);
        }
        MD5_Final(&(md[0]), &c);
        pt(md);
}

void pt(unsigned char *md)
{
        int i;

        for (i = 0; i < MD5_DIGEST_LENGTH; i++)
                printf("%02x", md[i]);
        printf("/n");
}
*/


/*
[/code]

的确是这样使用的，只不过如果是大文件，则是在一个循环中反复调用MD5_Update来完成的。
*/
